package ar.com.seminario.systema.model;

import java.util.Collections;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

import ar.com.seminario.common.domain.entity.Identifiable;

/**
 * Usuario que se loguea al sistema.
 * 
 * @author Pablo Lamas.
 * 
 */
@Entity
@Table(name = "sistema_usuario")
public class Usuario implements Identifiable<Long> {

	/**
	 * Numero de identificacion del usuario.
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "idusuario")
	private Long id;

	/**
	 * Nombre de usuario del usuario.
	 */
	@Column(name = "usuario", nullable = false)
	private String usuario;

	/**
	 * Nombre real del usuario.
	 */
	@Column(name = "nombre", nullable = false)
	private String nombre;

	/**
	 * Apellido real del usuario.
	 */
	@Column(name = "apellido", nullable = false)
	private String apellido;

	/**
	 * Clave real del usuario.
	 */
	@Column(name = "clave", nullable = false)
	private String clave;

	/**
	 * El tipo de usuario que es.
	 */
	@Column(name = "tipo_usuario_id", nullable = false)
	private Long tipoUsuarioId;

	/**
	 * El perfil del sistema del usuario.
	 */
	@ManyToMany(fetch = FetchType.EAGER, targetEntity = OpcionMenu.class, cascade = { CascadeType.PERSIST,
        		CascadeType.MERGE })
	@JoinTable(name = "sistema_perfil_usuario", 
		joinColumns = @JoinColumn(name = "usuario_id"), 
		inverseJoinColumns = @JoinColumn(name = "opcion_menu_id"))
	private List<OpcionMenu> opciones;

	/**
	 * Constructor por defecto.
	 */
	public Usuario() {

	}

	public Long getId() {
		return id;
	}

	protected void setId(Long id) {
		this.id = id;
	}

	public String getUsuario() {
		return usuario;
	}

	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getApellido() {
		return apellido;
	}

	public void setApellido(String apellido) {
		this.apellido = apellido;
	}

	public String getClave() {
		return clave;
	}

	public void setClave(String clave) {
		this.clave = clave;
	}

	public List<OpcionMenu> getOpciones() {
		return (this.opciones != null ? Collections.unmodifiableList(this.opciones) : null);
	}

	public void setOpciones(List<OpcionMenu> opciones) {
		this.opciones = opciones;
	}

	public TipoUsuario getTipoUsuario() {
		return TipoUsuario.fromId(tipoUsuarioId);
	}

	public void setTipoUsuario(TipoUsuario tipoUsuario) {
		if (tipoUsuario != null) {
			this.tipoUsuarioId = tipoUsuario.getId();
		} else {
			this.tipoUsuarioId = null;
		}
	}
}
